<?php
class Application_Model_Users extends Exts_Models_Users
{
	protected $_rowClass = 'User';
	
	public function findById($id){
		return $this->fetchRow ($this->select()->where ("user_id = ?", $id));
	}
	
	public static function instanciate ($idUser) {
		$model = new Application_Model_Users();
		return $model->findById ($idUser);
	}
}

class User extends Exts_Models_UsersRow {

	/**
	 * Un usuario es supervisor de otro si:
	 * a) supervisa directamente al usuario
	 * b) supervisa al supervisor del usuario
	 **/

	public function getCourses () {
		$coursesModel = new Application_Model_InsCourses();
		return $coursesModel->fetchByUser($this);
	}
	
	public function getResumen () {
		$coursesModel = new Application_Model_InsCourses();
		return $coursesModel->resumenDeUsuario($this);
	}
	
	public function getResumenDelMes () {
		$coursesModel = new Application_Model_InsCourses();
		return $coursesModel->resumenDelMesDeUsuario($this);
	}
	
	public function getResumenTotal () {
		$resumen = $this->getResumen();
		$precio = $this->course_price;

		$retorno = array();
		foreach($resumen as $detalle){
			$detalle['gain'] = $detalle['amount'] * $precio;
			$detalle ['goal'] = $this->monthly_goal;
			$detalle ['pct'] = 100 * $detalle ['amount'] / $detalle ['goal'];
			
			$retorno[] = $detalle;
			
		}

		return $retorno;
	}
	public function getGanancias () {
		$resumen = $this->getResumen();
		$precio = $this->course_price;

		$retorno = array();
		foreach($resumen as $detalle){
			$detalle['gain'] = $detalle['amount'] * $precio;
			$retorno[] = $detalle;
		}

		return $retorno;
	}
	
	public function getObjetivoDelMes() {
		$resumen = $this->getResumenDelMes();
		$resumen ['goal'] = $this->monthly_goal;
		$resumen ['pct'] = 100 * $resumen ['amount'] / $resumen ['goal'];
		
		return $resumen;
	}
	
	public function isSupervisor($user){
		return false;
		if (!$user->haveSupervisor()) return false;
		if ($this->isDirectSupervisor($user)) return true;
		return $this->isSupervisor($user->getSupervisor());
	}

	public function haveSupervisor() {
		return $this->supervisor_id != 0;
	}

	public function isDirectSupervisor ($user) {
		return $this->user_id = $user->supervisor_id;
	}

	public function getSupervisor() {
		if (!$this->haveSupervisor()) {
			throw new Exts_Exception (" El usuario $user->user_id no tiene supervisor ");
		}
		return $this->getTable()->findById($this->supervisor_id);
	}
	
	/*
	 * Los datos auditados tienen usuarios registrados asociados (Creador y modificador del contenido)
	 * Un usuario tiene acceso al contenido siempre que sea el creador o un supervisor del creador.
	 * Para eliminar un contenido ha de ser el supervisor del creador. 
	 * 
	 * 
	 * En los tres casos, $data debe ser un objeto Exts_Db_Table_Row_AuditableRow 
	 * o subclase de Exts_Db_Table_Row_AuditableRow
	 **/
	
	protected function _instanciateMaker ($data){
		if (is_object($data)){
			$idMaker = $data->create_user;
		}else if (is_array($data)) {
			if (isset($data['create_user']))
				$idMaker = $data['create_user'];
		}else {
			throw new Exts_Exception("¡Se esperaba un objeto o un array!");
		}
		if (empty($idMaker)) {
			throw new Exts_Exception("¡el objeto no tiene un usuario asociado!");
		}
	
		return $this->getTable()->findById($idMaker); 
	}
	
	public function canView ($data){
		$maker = $this->_instanciateMaker($data);
		if ($this->equals($maker)) {
            return true;
        }
		if ($this->isSupervisor($maker)){ 
            return true;
        }
		return false;
	}

	public function canEdit ($data){
		$maker = $this->_instanciateMaker($data);
		if ($this->equals($maker)) return true;
		if ($this->isSupervisor($maker)) return true;
		return false;
	}
	
	public function canDelete ($data){
		$maker = $this->_instanciateMaker($data);
		if ($this->isSupervisor($maker)) return true;
		return false;
	}
	

}
